package com.jsg.sl651.entity.data;

import com.jsg.sl651.util.ByteUtil;
import io.netty.buffer.ByteBuf;
import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * hex模式下，数据标识信息
 */
@Data
@AllArgsConstructor
public class Identifier {

    // 特殊标识
    private final static byte[] SPECIAL_HEX_KEY = new byte[]{(byte) 0xF0, (byte) 0xF1,(byte) 0xF2, (byte) 0xF3};

    // 数据标识Hex
    private final String keyHex;
    // 字节数
    private final int byteSize;
    // 精度
    private final int precision;
    // 数据字节
    public final byte[] data;

    public static Identifier createHex(ByteBuf byteBuf) {
        // 读取一个字节
        byte key = byteBuf.readByte();
        if (ByteUtil.isInArray(key, SPECIAL_HEX_KEY)) {
            return specialHex(byteBuf, key);
        }
        String keyhex = ByteUtil.toHex(key);
        if ((key & 0xFF) == 0xFF) {
            byte b = byteBuf.readByte();
            keyhex = keyhex + ByteUtil.toHex(b);
        }
        // 再读一个字节
        byte sizeInfo = byteBuf.readByte();
        int byteSize = (sizeInfo & 0xFF) >> 3 ;
        int precision = sizeInfo & 0x07;
        // 读取数据
        byte[] data = ByteUtil.readBytes(byteBuf, byteSize);
        return new Identifier(keyhex, byteSize, precision, data);
    }


    private static Identifier specialHex(ByteBuf byteBuf, byte key) {
        // 观测时间和测站编码都是固定5个字节
        if (key == SPECIAL_HEX_KEY[0] || key == SPECIAL_HEX_KEY[1]) {
            // 再读一个字节
            byte b = byteBuf.readByte();
            // 5个字节 观察时间
            byte[] bytes = ByteUtil.readBytes(byteBuf, 5);
            return new Identifier(ByteUtil.toHex(key), 5, 0, bytes);
        }
        // 图片信息
        if (key == SPECIAL_HEX_KEY[3]) {
            // 再读一个字节
            byte b = byteBuf.readByte();
            // 剩余字节全是图片信息
            int length = byteBuf.readableBytes();
            byte[] bytes = ByteUtil.readBytes(byteBuf, length);
            return new Identifier(ByteUtil.toHex(key), length, 0, bytes);
        }

        throw new RuntimeException("未知的特殊标识[请定义]");
    }

    public static Identifier createAscii(ByteBuf buffer) {
        // 读取数据标识
        String keyHex = ByteUtil.toHex(ByteUtil.readBytesUntilSpace(buffer));
        byte[] data = ByteUtil.readBytesUntilSpace(buffer);
        return new Identifier(keyHex, data.length, 0, data);
    }
}
